토큰 기반 인증
인증 정보를 클라이언트가 직접 들고 있는 방식
- 인증 정보가 토큰의 형태로 브라우저의 로컬 스토리지(혹은 쿠키)에 저장된다.
- Token 기반 인증의 방법으로 많은 웹 서버들은 JWT(Json Web Token)를 사용한다.
- Token 기반 인증 방식은 유저의 정보가 서버에 저장되지 않으며, 서버는 유저 인증을 위해 많은 일들을 하지 않아도 된다.
🧑🏻💻 동작 과정
유저가 로그인을 요청하고 정보가 유효하다면 서버에서 Secret Key를 사용해서 유저에게 토큰을 발급한다.
클라이언트는 발급 받은 토큰을 저장하고, 서버에서 요청 할 때 마다, 해당 토큰을 함께 서버에 전달한다.
- 액세스 토큰은 HTTP 헤더, 쿼리 매개변수 또는 쿠키 등을 통해 전달된다. (JWT는 액세스 토큰의 형식 중 하나이다.)
✏️ 액세스 토큰 구조
header
: 토큰을 어떻게 검증할지에 대한 내용을 담고 있다.payload
: 토큰에 담긴 사용자 정보 등의 데이터가 저장되어 있다. 일반적으로 사용자 정보와 토큰의 유효 기간 등을 포함한다.signature
: 서명 부분은 토큰의 무결성을 보장하기 위해 사용된다. 서명은 header와 payload를 함께 해시하여 생성된다. 서명을 생성하려면 서버 또는 인증 서버에 고유한 비밀 키가 필요하다. 이 서명은 토큰을 변조하기 어렵게 한다.
서버는 토큰을 검증 하고, 요청에 응답한다.
액세스 토큰이 만료되면, 클라이언트는 서버에서 새로운 액세스 토큰을 요청한다.
사용자가 로그아웃하거나 권한이 박탈된 경우, 서버는 해당 액세스 토큰을 무효화한다.
🧑🏻💻 장단점
✅ 장점
- 클라이언트에 토큰이 저장되어 있기 때문에 서버의 메모리에 부담이 되지 않는다.
- 서버 확장성이 용이하고 여러 서버 간의 세션 공유 문제가 없다.
- 멀티 디바이스 환경에 대한 부담이 없다.
✅ 단점
- 클라이언트 측에서 토큰을 보관해야 하므로 토큰을 안전하게 관리해야 한다.
- 토큰을 생성하고 관리하는 추가적인 작업이 필요하므로 구현 및 유지 관리가 복잡할 수 있다.
- 토큰은 자체적으로 세션을 관리하지 않으므로 세션 만료나 로그아웃과 같은 작업을 직접 구현해야 한다.